{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "b59727ff",
   "metadata": {},
   "outputs": [],
   "source": [
    "data_sources = {\n",
    "    \"training_images\": \"train-images-idx3-ubyte.gz\",  # 60,000 training images.\n",
    "    \"test_images\": \"t10k-images-idx3-ubyte.gz\",  # 10,000 test images.\n",
    "    \"training_labels\": \"train-labels-idx1-ubyte.gz\",  # 60,000 training labels.\n",
    "    \"test_labels\": \"t10k-labels-idx1-ubyte.gz\",  # 10,000 test labels.\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "f1c307ed",
   "metadata": {},
   "outputs": [],
   "source": [
    "import requests\n",
    "import os\n",
    "\n",
    "data_dir = \"./data\"\n",
    "os.makedirs(data_dir, exist_ok=True)\n",
    "\n",
    "base_url = \"https://github.com/rossbar/numpy-tutorial-data-mirror/blob/main/\"\n",
    "\n",
    "for fname in data_sources.values():\n",
    "    fpath = os.path.join(data_dir, fname)\n",
    "    if not os.path.exists(fpath):\n",
    "        print(\"Downloading file: \" + fname)\n",
    "        resp = requests.get(base_url + fname, stream=True)\n",
    "        resp.raise_for_status()  # Ensure download was succesful\n",
    "        with open(fpath, \"wb\") as fh:\n",
    "            for chunk in resp.iter_content(chunk_size=128):\n",
    "                fh.write(chunk)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "b3c59bfa",
   "metadata": {},
   "outputs": [],
   "source": [
    "import gzip\n",
    "import numpy as np\n",
    "\n",
    "mnist_dataset = {}\n",
    "\n",
    "# Images\n",
    "for key in (\"training_images\", \"test_images\"):\n",
    "    with gzip.open(os.path.join(data_dir, data_sources[key]), \"rb\") as mnist_file:\n",
    "        mnist_dataset[key] = np.frombuffer(\n",
    "            mnist_file.read(), np.uint8, offset=16\n",
    "        ).reshape(-1, 28 * 28)\n",
    "# Labels\n",
    "for key in (\"training_labels\", \"test_labels\"):\n",
    "    with gzip.open(os.path.join(data_dir, data_sources[key]), \"rb\") as mnist_file:\n",
    "        mnist_dataset[key] = np.frombuffer(mnist_file.read(), np.uint8, offset=8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "abc17b9c",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train, y_train, x_test, y_test = (\n",
    "    mnist_dataset[\"training_images\"],\n",
    "    mnist_dataset[\"training_labels\"],\n",
    "    mnist_dataset[\"test_images\"],\n",
    "    mnist_dataset[\"test_labels\"],\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "e2033009",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The shape of training images: (60000, 784) and training labels: (60000,)\n",
      "The shape of test images: (10000, 784) and test labels: (10000,)\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    \"The shape of training images: {} and training labels: {}\".format(\n",
    "        x_train.shape, y_train.shape\n",
    "    )\n",
    ")\n",
    "print(\n",
    "    \"The shape of test images: {} and test labels: {}\".format(\n",
    "        x_test.shape, y_test.shape\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "75a08c73",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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l2LmwacDOTe6CoVCys3N7ZXnx+rVq3Xw4EEdO3Ys5le/9LXz4fOOQ3d66vmQEhEaNGiQJkyYoMrKypjHKysrlZ+fb7Qqex0dHfroo48UCoWsl2ImLy9PwWAw5ty4e/euqqur+/S5IUmtra1qaGjoVeeHc06rVq3S/v37dfToUeXl5cU831fOh0cdh+702PPB8EMRnrz33ntu4MCB7p133nH/+Mc/3Jo1a9zQoUPdtWvXrJf21Lz66quuqqrKXb161Z0+fdp9+9vfdmlpab3+GLS1tblz5865c+fOOUlu69at7ty5c+5f//qXc865119/3QUCAbd//3538eJFt3jxYhcKhVwkEjFeeWI97Di0tbW5V1991Z06dcrV1dW5Y8eOualTp7ovfvGLveo4LF++3AUCAVdVVeWampqi261bt6L79IXz4VHHIZXOh5SJkHPObd++3eXm5rpBgwa55557LubjiH3BokWLXCgUcgMHDnTZ2dmuqKjIXbp0yXpZSXfs2DEnqctWXFzsnLv/sdyNGze6YDDo/H6/mz59urt48aLtopPgYcfh1q1brqCgwA0fPtwNHDjQjRw50hUXF7v6+nrrZSdUd//+ktzOnTuj+/SF8+FRxyGVzgd+lQMAwExKvCcEAOidiBAAwAwRAgCYIUIAADNECABghggBAMwQIQCAGSIEADBDhAAAZogQAMAMEQIAmCFCAAAz/w/x5/6wAJugQwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# Take the 60,000th image (indexed at 59,999) from the training set,\n",
    "# reshape from (784, ) to (28, 28) to have a valid shape for displaying purposes.\n",
    "mnist_image = x_train[59999, :].reshape(28, 28)\n",
    "# Set the color mapping to grayscale to have a black background.\n",
    "plt.imshow(mnist_image, cmap=\"gray\")\n",
    "# Display the image.\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "53f66f80",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  38  48\n",
      "   48  22   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0  62  97 198 243 254\n",
      "  254 212  27   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0  67 172 254 254 225 218\n",
      "  218 237 248  40   0  21 164 187   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0  89 219 254  97  67  14   0\n",
      "    0  92 231 122  23 203 236  59   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0  25 217 242  92   4   0   0   0\n",
      "    0   4 147 253 240 232  92   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0 101 255  92   0   0   0   0   0\n",
      "    0 105 254 254 177  11   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0 167 244  41   0   0   0   7  76\n",
      "  199 238 239  94  10   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0 192 121   0   0   2  63 180 254\n",
      "  233 126   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0 190 196  14   2  97 254 252 146\n",
      "   52   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0 130 225  71 180 232 181  60   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0 130 254 254 230  46   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   6  77 244 254 162   4   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0 110 254 218 254 116   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0 131 254 154  28 213  86   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0  66 209 153  19  19 233  60   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0 142 254 165   0  14 216 167   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0  90 254 175   0  18 229  92   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0  26 229 249 176 222 244  44   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0  73 193 197 134   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]\n",
      " [  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "    0   0   0   0   0   0   0   0   0   0]]\n"
     ]
    }
   ],
   "source": [
    "print(mnist_image)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "7ef6e38c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAh8AAACFCAYAAAD7P5rdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAaPklEQVR4nO3dfXBU1RkG8DcEsiRpSIs0u6wQjTZFKDSUNKYgJakj0bFSERxSv4ptaRVISkr9IGOF+NEsQpu2FhC1gIplsNYgYaq2sUAQGS3gpATSgtRAUyBGELJEQiLk9A+a1/cuu8ne5O7dc5PnN5OZZz+ye5I3dzncc885MUopRQAAAAA26RftBgAAAEDfgs4HAAAA2AqdDwAAALAVOh8AAABgK3Q+AAAAwFbofAAAAICt0PkAAAAAW6HzAQAAALZC5wMAAABshc4HAAAA2CpinY8VK1ZQWloaDRw4kDIzM+mtt96K1FuBCaiLvlAbfaE2ekJdHExFwPr169WAAQPUs88+q2pra9W8efNUYmKiOnz4cCTeDsKEuugLtdEXaqMn1MXZYpSyfmO57OxsGjduHD311FN838iRI2nq1Knk8/k6/d729nY6evQoJSUlUUxMjNVN67OUUpSbm0vZ2dm0cuVKvj/cuhChNpGC2uhJKUWnT5+m6dOn4/NMMzhm9NRxzHi9XurXr/OBlf5Wv3lbWxvt3r2bFixYYLg/Ly+PduzYcdHzW1tbqbW1lW8fOXKERo0aZXWz4P/mzJljuB2qLkSojd1QGz3Fxsbi80xTOGb0VF9fT8OGDev0OZZf83H8+HE6f/48ud1uw/1ut5saGhouer7P56Pk5GT+wh9DZF122WWG26HqQoTa2A210RM+z/SFY0ZPSUlJXT4nYhecBp7GUkoFPbVVXFxMTU1N/FVfXx+pJgHRRafCQtWFCLWxG2qjL3ye6QnHjJ7CGcayfNhlyJAhFBsbe1Hvs7Gx8aL/PRARuVwucrlcVjcDQvjwww8Nt0PVhQi1sRtqoyd8nukLx4xzWX7mIy4ujjIzM6mystJwf2VlJU2YMMHqtwOTtmzZYriNuugDtdHT2LFj8XmmKRwzDhaJKTQdU6BWrVqlamtrVVFRkUpMTFSHDh3q8nubmpoUEeErQl/drQtqg9r01a/Vq1fj80x8rV27lr+kGTNm8JddbcExo+dXU1NTl79/y4ddiIjy8/PpxIkT9Oijj9KxY8do9OjR9Nprr110cRDYz+fzoS6aQm30NH36dGppaUFtNIRjxrkiss5HT/j9fkpOTo52M3qtpqYmGjRoULe+F7WJLNRGT6iL0dq1aznfeeednPPz8zn/8Y9/tKUtqI2ewqlLRM58AACAs40ePZrzT37yE87f/e53Ocv/uyYmJtrTMOgVsLEcAAAA2AqdDwAAALAVhl0AAOAiU6ZM4Txr1qwun79kyRLOGzdu5Pzxxx9b2zDoFXDmAwAAAGyFzgcAAADYqs8Mu8TGxhpuy7ngcopYqKV5rTJ27FjOq1ev5vzCCy9E9H37usGDB3N+/PHHOd96662chwwZwnnq1KmcKyoqIts4gCi65JJLOC9btozzjBkzTL3OP/7xD85nz57tecMgIuS+KwkJCYbHsrKyOE+bNo3z8OHDOcvPzPPnz3e7HTjzAQAAALZC5wMAAABs1auHXS699FLOK1euNDx24403WvIe8hSW2cVijxw5whnDLtbLzc3lLFdclMMroTz88MOc//KXv3BubW21pnEOJReSSkpKMvW9NTU1nOVxM2LECM4nTpzoQesgXHKo5Te/+Q1nOQQdju3bt3OeP38+5zNnznS/cWCJ1NRUzjk5OZxvueUWznJ4OVxlZWWc582b173GEc58AAAAgM3Q+QAAAABb9ephl7S0NM5yCCbQBx98wHnLli2m3mP8+PGcR40a1eXzP/roI86//vWvTb0XdM3r9XLesGEDZ7MbSGVmZnKWe1y0tLQYnldbW2u2iY4iZwkRET300EOce3TKtd9n/++prKzkPG7cuG6/JoSvpKSE8x133GHqe6urqzl///vf5/zvf/+7p82CAFdeeSVnOTR/8OBBznIIc8KECZw///nPcw48jsPh9/s5P/PMM5zPnTtn+rWCwZkPAAAAsBU6HwAAAGArdD4AAADAVr36mg85Dewb3/iG4bH+/T/70eUqbeFMpbzmmms433333V0+v729nXNhYSHnXbt2dfm9YI4cgw51nUd5eTnnl156iXNRURFneS3Pyy+/zDlwpdz09HTObW1t5husITkV+b777jM81pPrPEKRU3bltTa7d++2/L36srVr13K+7bbbTH3v+++/z/m6667jjE3jrCevW9uzZw/n+Ph4zvLzyazNmzdz/uc//2l47M033+T89ttvcz5+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",
      "text/plain": [
       "<Figure size 640x480 with 5 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Display 5 random images from the training set.\n",
    "num_examples = 5\n",
    "seed = 147197952744\n",
    "rng = np.random.default_rng(seed)\n",
    "\n",
    "fig, axes = plt.subplots(1, num_examples)\n",
    "for sample, ax in zip(rng.choice(x_train, size=num_examples, replace=False), axes):\n",
    "    ax.imshow(sample.reshape(28, 28), cmap=\"gray\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "949a2e02",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[5],\n",
       "       [0],\n",
       "       [4],\n",
       "       [1],\n",
       "       [9],\n",
       "       [2],\n",
       "       [1],\n",
       "       [3],\n",
       "       [1],\n",
       "       [4]], dtype=uint8)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train[:10][..., None]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "51c7f802",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The data type of training images: uint8\n",
      "The data type of test images: uint8\n"
     ]
    }
   ],
   "source": [
    "print(\"The data type of training images: {}\".format(x_train.dtype))\n",
    "print(\"The data type of test images: {}\".format(x_test.dtype))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "956a52da",
   "metadata": {},
   "outputs": [],
   "source": [
    "training_sample, test_sample = 10000, 1000\n",
    "training_images = x_train[0:training_sample] / 255\n",
    "test_images = x_test[0:test_sample] / 255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "62a3d94c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The data type of training images: float64\n",
      "The data type of test images: float64\n"
     ]
    }
   ],
   "source": [
    "print(\"The data type of training images: {}\".format(training_images.dtype))\n",
    "print(\"The data type of test images: {}\".format(test_images.dtype))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "1d09b58b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def one_hot_encoding(labels, dimension=10):\n",
    "    # Define a one-hot variable for an all-zero vector\n",
    "    # with 10 dimensions (number labels from 0 to 9).\n",
    "    one_hot_labels = labels[..., None] == np.arange(dimension)[None]\n",
    "    # Return one-hot encoded labels.\n",
    "    return one_hot_labels.astype(np.float64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "15d268fd",
   "metadata": {},
   "outputs": [],
   "source": [
    "training_labels = one_hot_encoding(y_train[:training_sample])\n",
    "test_labels = one_hot_encoding(y_test[:test_sample])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "362d3b70",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The data type of training labels: float64\n",
      "The data type of test labels: float64\n"
     ]
    }
   ],
   "source": [
    "print(\"The data type of training labels: {}\".format(training_labels.dtype))\n",
    "print(\"The data type of test labels: {}\".format(test_labels.dtype))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "be65721c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n",
      "[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n",
      "[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n"
     ]
    }
   ],
   "source": [
    "print(training_labels[0])\n",
    "print(training_labels[1])\n",
    "print(training_labels[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "5689b4e5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n",
      "0\n",
      "4\n"
     ]
    }
   ],
   "source": [
    "print(y_train[0])\n",
    "print(y_train[1])\n",
    "print(y_train[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "27cc3e4a",
   "metadata": {},
   "outputs": [],
   "source": [
    "seed = 884736743\n",
    "rng = np.random.default_rng(seed)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "61498ce0",
   "metadata": {},
   "outputs": [],
   "source": [
    "def relu(x):\n",
    "    return (x >= 0) * x\n",
    "\n",
    "def relu2deriv(output):\n",
    "    return output >= 0\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "09774525",
   "metadata": {},
   "outputs": [],
   "source": [
    "learning_rate = 0.005\n",
    "epochs = 20\n",
    "hidden_size = 100\n",
    "pixels_per_image = 28*28\n",
    "num_labels = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "e5f1f1a3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0,\n",
       "       0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1,\n",
       "       0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1,\n",
       "       1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0,\n",
       "       0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "28*28\n",
    "rng.integers(low=0, high=2, size=(100,))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "b4b28791",
   "metadata": {},
   "outputs": [],
   "source": [
    "weights_1 = 0.2 * rng.random((pixels_per_image, hidden_size)) - 0.1\n",
    "weights_2 = 0.2 * rng.random((hidden_size, num_labels)) - 0.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "7e324cb7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 0\n",
      "  Training set error: 0.891\n",
      "  Training set accuracy: 0.407\n",
      "  Test set error: 0.677\n",
      "  Test set accuracy: 0.58\n",
      "Epoch: 1\n",
      "  Training set error: 0.657\n",
      "  Training set accuracy: 0.609\n",
      "  Test set error: 0.617\n",
      "  Test set accuracy: 0.633\n",
      "Epoch: 2\n",
      "  Training set error: 0.604\n",
      "  Training set accuracy: 0.676\n",
      "  Test set error: 0.578\n",
      "  Test set accuracy: 0.664\n",
      "Epoch: 3\n",
      "  Training set error: 0.567\n",
      "  Training set accuracy: 0.717\n",
      "  Test set error: 0.547\n",
      "  Test set accuracy: 0.697\n",
      "Epoch: 4\n",
      "  Training set error: 0.530\n",
      "  Training set accuracy: 0.723\n",
      "  Test set error: 0.529\n",
      "  Test set accuracy: 0.702\n",
      "Epoch: 5\n",
      "  Training set error: 0.519\n",
      "  Training set accuracy: 0.741\n",
      "  Test set error: 0.514\n",
      "  Test set accuracy: 0.719\n",
      "Epoch: 6\n",
      "  Training set error: 0.511\n",
      "  Training set accuracy: 0.733\n",
      "  Test set error: 0.500\n",
      "  Test set accuracy: 0.725\n",
      "Epoch: 7\n",
      "  Training set error: 0.486\n",
      "  Training set accuracy: 0.751\n",
      "  Test set error: 0.484\n",
      "  Test set accuracy: 0.745\n",
      "Epoch: 8\n",
      "  Training set error: 0.485\n",
      "  Training set accuracy: 0.756\n",
      "  Test set error: 0.479\n",
      "  Test set accuracy: 0.738\n",
      "Epoch: 9\n",
      "  Training set error: 0.476\n",
      "  Training set accuracy: 0.759\n",
      "  Test set error: 0.476\n",
      "  Test set accuracy: 0.758\n",
      "Epoch: 10\n",
      "  Training set error: 0.473\n",
      "  Training set accuracy: 0.776\n",
      "  Test set error: 0.482\n",
      "  Test set accuracy: 0.746\n",
      "Epoch: 11\n",
      "  Training set error: 0.473\n",
      "  Training set accuracy: 0.761\n",
      "  Test set error: 0.468\n",
      "  Test set accuracy: 0.761\n",
      "Epoch: 12\n",
      "  Training set error: 0.463\n",
      "  Training set accuracy: 0.782\n",
      "  Test set error: 0.468\n",
      "  Test set accuracy: 0.757\n",
      "Epoch: 13\n",
      "  Training set error: 0.463\n",
      "  Training set accuracy: 0.785\n",
      "  Test set error: 0.467\n",
      "  Test set accuracy: 0.765\n",
      "Epoch: 14\n",
      "  Training set error: 0.467\n",
      "  Training set accuracy: 0.766\n",
      "  Test set error: 0.464\n",
      "  Test set accuracy: 0.768\n",
      "Epoch: 15\n",
      "  Training set error: 0.458\n",
      "  Training set accuracy: 0.781\n",
      "  Test set error: 0.454\n",
      "  Test set accuracy: 0.78\n",
      "Epoch: 16\n",
      "  Training set error: 0.449\n",
      "  Training set accuracy: 0.795\n",
      "  Test set error: 0.456\n",
      "  Test set accuracy: 0.775\n",
      "Epoch: 17\n",
      "  Training set error: 0.438\n",
      "  Training set accuracy: 0.795\n",
      "  Test set error: 0.461\n",
      "  Test set accuracy: 0.773\n",
      "Epoch: 18\n",
      "  Training set error: 0.452\n",
      "  Training set accuracy: 0.793\n",
      "  Test set error: 0.460\n",
      "  Test set accuracy: 0.782\n",
      "Epoch: 19\n",
      "  Training set error: 0.442\n",
      "  Training set accuracy: 0.79\n",
      "  Test set error: 0.450\n",
      "  Test set accuracy: 0.784\n"
     ]
    }
   ],
   "source": [
    "store_training_loss = []\n",
    "store_training_accurate_pred = []\n",
    "store_test_loss = []\n",
    "store_test_accurate_pred = []\n",
    "\n",
    "for j in range(epochs):\n",
    "    training_loss = 0.0\n",
    "    training_accurate_predictions = 0\n",
    "    \n",
    "    for i in range(len(training_images)):\n",
    "        \n",
    "        layer_0 = training_images[i]\n",
    "        layer_1 = np.dot(layer_0, weights_1)\n",
    "        layer_1 = relu(layer_1)\n",
    "        \n",
    "        dropout_mask = rng.integers(low=0, high=2, size=layer_1.shape)\n",
    "        layer_1 *= dropout_mask * 2\n",
    "        \n",
    "        layer_2 = np.dot(layer_1, weights_2)\n",
    "        \n",
    "        training_loss += np.sum((training_labels[i] - layer_2) ** 2)\n",
    "        \n",
    "        training_accurate_predictions += int(\n",
    "            np.argmax(layer_2) == np.argmax(training_labels[i])\n",
    "        )# 训练得到正确的次数\n",
    "        \n",
    "        layer_2_delta = training_labels[i] - layer_2\n",
    "        layer_1_delta = np.dot(weights_2, layer_2_delta) * relu2deriv(layer_1)\n",
    "        \n",
    "        layer_1_delta *= dropout_mask\n",
    "        \n",
    "        weights_1 += learning_rate * np.outer(layer_0, layer_1_delta)\n",
    "        weights_2 += learning_rate * np.outer(layer_1, layer_2_delta)\n",
    "        \n",
    "    store_training_loss.append(training_loss)\n",
    "    store_training_accurate_pred.append(training_accurate_predictions)\n",
    "    results = relu(test_images @ weights_1) @ weights_2\n",
    "\n",
    "    # Measure the error between the actual label (truth) and prediction values.\n",
    "    test_loss = np.sum((test_labels - results) ** 2)\n",
    "\n",
    "    # Measure prediction accuracy on test set\n",
    "    test_accurate_predictions = np.sum(\n",
    "        np.argmax(results, axis=1) == np.argmax(test_labels, axis=1)\n",
    "    )\n",
    "\n",
    "    # Store test set losses and accurate predictions.\n",
    "    store_test_loss.append(test_loss)\n",
    "    store_test_accurate_pred.append(test_accurate_predictions)\n",
    "\n",
    "    # Summarize error and accuracy metrics at each epoch\n",
    "    print(\n",
    "        (\n",
    "            f\"Epoch: {j}\\n\"\n",
    "            f\"  Training set error: {training_loss / len(training_images):.3f}\\n\"\n",
    "            f\"  Training set accuracy: {training_accurate_predictions / len(training_images)}\\n\"\n",
    "            f\"  Test set error: {test_loss / len(test_images):.3f}\\n\"\n",
    "            f\"  Test set accuracy: {test_accurate_predictions / len(test_images)}\"\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "744ab882",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABL4AAAHUCAYAAAA0teGXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADE90lEQVR4nOzdd3hTdf/G8Xe60r2hLZ1QyiyzDAFBUWQruAAHCOLAjTh+bkV9RH0cKAqPA8SBgFtUQEFkibL3XqUUWkoLdNKVnN8fgUilQAtt05b7dV25cnJyxifUY0/vfIfJMAwDERERERERERGRWsbJ0QWIiIiIiIiIiIhUBgVfIiIiIiIiIiJSKyn4EhERERERERGRWknBl4iIiIiIiIiI1EoKvkREREREREREpFZS8CUiIiIiIiIiIrWSgi8REREREREREamVFHyJiIiIiIiIiEitpOBLRERERERERERqJQVfIoLJZCrTY+HChRd0nhdeeAGTyXRe+y5cuLBCanC0LVu28MILL5CYmOjoUkRERETOqaruEwHy8vJ44YUXHHK/d/DgQV544QXWrVtX5ecWkcrl4ugCRMTx/vrrrxKvX3rpJf744w8WLFhQYn2zZs0u6Dx33HEHvXv3Pq9927Zty19//XXBNTjali1bGDt2LJdffjkxMTGOLkdERETkrKrqPhFswdfYsWMBuPzyyy/4eOVx8OBBxo4dS0xMDK1bt67Sc4tI5VLwJSJccsklJV7XqVMHJyen09b/W15eHp6enmU+T0REBBEREedVo6+v7znrEREREZGKdb73iSIi1YW6OopImVx++eXEx8ezePFiOnfujKenJ7fffjsAM2fOpGfPnoSFheHh4UHTpk154oknyM3NLXGM0ro6xsTE0L9/f+bOnUvbtm3x8PCgSZMmTJkypcR2pXV1HD58ON7e3uzatYu+ffvi7e1NZGQkjzzyCAUFBSX2T05O5oYbbsDHxwd/f39uueUWVq5ciclkYurUqWf97Hl5eTz66KPUr18fd3d3AgMDadeuHdOnTy+x3apVq7jmmmsIDAzE3d2dNm3a8NVXX9nfnzp1KjfeeCMA3bt3t3cNONf5RURERKqzwsJCXn75ZZo0aYLZbKZOnTqMGDGCw4cPl9huwYIFXH755QQFBeHh4UFUVBTXX389eXl5JCYmUqdOHQDGjh1rv08aPnz4Gc9rtVp5+eWXady4MR4eHvj7+9OyZUveeeedEtvt3LmTm2++mbp162I2m2natCnvv/++/f2FCxfSvn17AEaMGGE/9wsvvFAx/0Ai4lBq8SUiZZaSksKtt97K448/ziuvvIKTky0737lzJ3379mX06NF4eXmxbds2XnvtNVasWHFaM/jSrF+/nkceeYQnnniCkJAQPv74Y0aOHEnDhg3p1q3bWfctKirimmuuYeTIkTzyyCMsXryYl156CT8/P5577jkAcnNz6d69O0eOHOG1116jYcOGzJ07l8GDB5fpc48ZM4bPP/+cl19+mTZt2pCbm8umTZvIyMiwb/PHH3/Qu3dvOnbsyP/+9z/8/PyYMWMGgwcPJi8vj+HDh9OvXz9eeeUVnnrqKd5//33atm0LQGxsbJnqEBEREalurFYrAwYMYMmSJTz++ON07tyZffv28fzzz3P55ZezatUqPDw8SExMpF+/fnTt2pUpU6bg7+/PgQMHmDt3LoWFhYSFhTF37lx69+7NyJEjueOOOwDsYVhpXn/9dV544QWeeeYZunXrRlFREdu2bePYsWP2bbZs2ULnzp2JiorizTffJDQ0lF9//ZUHH3yQ9PR0nn/+edq2bcsnn3zCiBEjeOaZZ+jXrx/AefdUEJFqxhAR+ZfbbrvN8PLyKrHusssuMwDj999/P+u+VqvVKCoqMhYtWmQAxvr16+3vPf/888a//7cTHR1tuLu7G/v27bOvO378uBEYGGjcfffd9nV//PGHARh//PFHiToB46uvvipxzL59+xqNGze2v37//fcNwJgzZ06J7e6++24DMD755JOzfqb4+Hhj4MCBZ92mSZMmRps2bYyioqIS6/v372+EhYUZFovFMAzD+Prrr0/7HCIiIiI1xb/vE6dPn24Axrfffltiu5UrVxqAMXHiRMMwDOObb74xAGPdunVnPPbhw4cNwHj++efLVEv//v2N1q1bn3WbXr16GREREUZmZmaJ9ffff7/h7u5uHDlypES957ovFJGaR10dRaTMAgICuOKKK05bv2fPHm6++WZCQ0NxdnbG1dWVyy67DICtW7ee87itW7cmKirK/trd3Z1GjRqxb9++c+5rMpm4+uqrS6xr2bJliX0XLVqEj4/PaQPr33TTTec8PkCHDh2YM2cOTzzxBAsXLuT48eMl3t+1axfbtm3jlltuAaC4uNj+6Nu3LykpKWzfvr1M5xIRERGpSX7++Wf8/f25+uqrS9wDtW7dmtDQUPswFa1bt8bNzY277rqLTz/9lD179lzwuTt06MD69eu59957+fXXX8nKyirxfn5+Pr///jvXXnstnp6ep92j5efn8/fff19wHSJSvSn4EpEyCwsLO21dTk4OXbt2Zfny5bz88sssXLiQlStX8t133wGcFhKVJigo6LR1ZrO5TPt6enri7u5+2r75+fn21xkZGYSEhJy2b2nrSvPuu+/yf//3f/zwww90796dwMBABg4cyM6dOwE4dOgQAI8++iiurq4lHvfeey8A6enpZTqXiIiISE1y6NAhjh07hpub22n3QampqfZ7oNjYWObPn0/dunW57777iI2NJTY29rTxuMrjySef5I033uDvv/+mT58+BAUFceWVV7Jq1SrAdg9YXFzMhAkTTqutb9++gO7RRC4GGuNLRMrs3wPTg22Q0oMHD7Jw4UJ7Ky+gxNgKjhYUFMSKFStOW5+amlqm/b28vBg7dixjx47l0KFD9tZfV199Ndu2bSM4OBiw3Xxdd911pR6jcePG5/8BRERERKqp4OBggoKCmDt3bqnv+/j42Je7du1K165dsVgsrFq1igkTJjB69GhCQkIYMmRIuc/t4uLCmDFjGDNmDMeOHWP+/Pk89dRT9OrVi/379xMQEICzszNDhw7lvvvuK/UY9evXL/d5RaRmUfAlIhfkZBhmNptLrP/ggw8cUU6pLrvsMr766ivmzJlDnz597OtnzJhR7mOFhIQwfPhw1q9fz/jx48nLy6Nx48bExcWxfv16XnnllbPuf/LfqSyt2URERESqu/79+zNjxgwsFgsdO3Ys0z7Ozs507NiRJk2aMG3aNNasWcOQIUMu6D7J39+fG264gQMHDjB69GgSExNp1qwZ3bt3Z+3atbRs2RI3N7cz7q97NJHaS8GXiFyQzp07ExAQwKhRo3j++edxdXVl2rRprF+/3tGl2d122228/fbb3Hrrrbz88ss0bNiQOXPm8OuvvwLYZ6c8k44dO9K/f39atmxJQEAAW7du5fPPP6dTp054enoCtqCvT58+9OrVi+HDhxMeHs6RI0fYunUra9as4euvvwYgPj4egA8//BAfHx/c3d2pX79+qd09RURERKq7IUOGMG3aNPr27ctDDz1Ehw4dcHV1JTk5mT/+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06ZNtG1b9bLl2dnZ/PrXv2bIkCHs37+/wv6wsDDS0tJctinpJSIiDar1JaZI/Yu+GKL/Ale/BGkLTBJs+7ewa5kp85+GHreYoZAXxLvFsFCn3QHY7cixArJy8wHoFNHE5mhERERE6scbb7zBfffdx/33389FF13EpEmTiImJYcqUKdWe99BDD3HnnXeSmJhY6X6Hw0FUVJRLERERES/nFwjdb4ZRs+HJn+DK56BpOyjINYsQ/H0ITE4w84PZrNEnvraWDHO8oGkQoYF+NkcjIiIiUvcKCgpYu3YtSUlJLtuTkpJYuXJlledNmzaN7du388ILL1R5TF5eHu3ataNNmzZce+21pKSkVBtLfn4+OTk5LkVEREQ8WHgbGPQ7+J9UGP1fuPh28A2CA1ugqBYrZtaTc0p8TZ48mdjYWAIDA4mPj2fZsmU1Om/FihX4+vpyySWXnMvb1oueMU2Z89t+/O/NPewORURERKReHDx4kKKiIiIjI122R0ZGkpmZWek527ZtY9y4cXz88cf4+lY+O0aXLl2YPn068+bN45NPPiEwMJD+/fuzbdu2KmOZOHEi4eHhZSUmJubcKyYiIiLuw+mE2AFw87vwdBpc939mBUi7w6rtCaXzQzz77LOkpKQwYMAAhg8fTnp6erXnnT4/hDsJ9POhV9tmDOrcyu5QREREROqV44x5NizLqrANoKioiDvvvJMJEybQuXPnKq+XkJDA3XffTc+ePRkwYACfffYZnTt35q233qrynPHjx5OdnV1W9uzZc+4VEhEREfcUGA7x95ghkTardeKrvuaHEBEREZH60bJlS3x8fCr07srKyqrQCwwgNzeXH374gUcffRRfX198fX156aWXWL9+Pb6+vnz77beVvo/T6eTSSy+ttsdXQEAAYWFhLkVERESkvtQq8VWf80OcTnM/iIiIiNQdf39/4uPjSU5OdtmenJxMv379KhwfFhbGhg0bSE1NLStjxowhLi6O1NRU+vbtW+n7WJZFamoq0dHR9VIPERERkdqqfMKGKpzP/BDLli2rcn6IM02cOJEJEybUJjQRERERqcbYsWMZNWoUffr0ITExkalTp5Kens6YMWMAMwRx7969fPTRRzidTrp37+5yfkREBIGBgS7bJ0yYQEJCAp06dSInJ4c333yT1NRU3n777Qatm4iIiEhVapX4KlXX80Ocafz48YwdO7bsdU5OjiY+FRERETkPI0eO5NChQ7z00ktkZGTQvXt3FixYQLt27QDIyMg465ytZzp69CgPPvggmZmZhIeH06tXL5YuXcpll11WH1UQERERqTWHZVlWTQ8uKCggODiYzz//nJtuuqls++OPP05qaipLlixxOf7o0aM0a9YMHx+fsm3FxcVYloWPjw9ff/01gwcPPuv75uTkEB4eTnZ2tuaBEBERkRpR+8Ez6D6JiIhIbdWm/VCrOb4aan4IERERERERERGR81XroY71MT+EiIiIiIiIiIhIXat14qs+5ocQERERERERERGpa7Wa48sumvtBREREakvtB8+g+yQiIiK1VW9zfImIiIiIiIiIiHgKJb5ERERERERERMQrKfElIiIiIiIiIiJeSYkvERERERERERHxSkp8iYiIiIiIiIiIV/K1O4CaKF14Micnx+ZIRERExFOUths8YAHrRk3tPBEREamt2rTzPCLxlZubC0BMTIzNkYiIiIinyc3NJTw83O4wpApq54mIiMi5qkk7z2F5wNegxcXF7Nu3j9DQUBwOh93hNJicnBxiYmLYs2cPYWFhdofToFR31b2x1R0ad/1Vd9W9PupuWRa5ubm0bt0ap1OzO7grtfP0s9+YNOa6Q+Ouv+quuqvudas27TyP6PHldDpp06aN3WHYJiwsrNH9kJRS3VX3xqgx1191V93rmnp6uT+18/Sz3xg15rpD466/6q66Nzbu0M7T158iIiIiIiIiIuKVlPgSERERERERERGvpMSXGwsICOCFF14gICDA7lAanOquujdGjbn+qrvqLtLYNOb//6p746w7NO76q+6qe2PjTnX3iMntRUREREREREREaks9vkRERERERERExCsp8SUiIiIiIiIiIl5JiS8REREREREREfFKSnyJiIiIiIiIiIhXUuLLJhMnTuTSSy8lNDSUiIgIbrzxRtLS0qo9Z/HixTgcjgply5YtDRR13XjxxRcr1CEqKqrac5YsWUJ8fDyBgYF06NCBd955p4GirVvt27ev9B4+8sgjlR7vyfd86dKlXHfddbRu3RqHw8HcuXNd9luWxYsvvkjr1q0JCgriiiuuYOPGjWe97qxZs+jatSsBAQF07dqVOXPm1FMNzk919S8sLOSZZ56hR48ehISE0Lp1a37961+zb9++aq85ffr0Sv8/nDx5sp5rUztnu/f33HNPhTokJCSc9bqecO/PVvfK7p/D4eDVV1+t8pqect9r8rnm7T/3IqXUzlM7z9vbedC423pq56mdp3aeZ7XzlPiyyZIlS3jkkUdYvXo1ycnJnDp1iqSkJI4dO3bWc9PS0sjIyCgrnTp1aoCI61a3bt1c6rBhw4Yqj925cycjRoxgwIABpKSk8Ic//IH/+Z//YdasWQ0Ycd1Ys2aNS72Tk5MB+NWvflXteZ54z48dO0bPnj3529/+Vun+v/zlL7zxxhv87W9/Y82aNURFRXH11VeTm5tb5TVXrVrFyJEjGTVqFOvXr2fUqFHcdtttfPfdd/VVjXNWXf2PHz/OunXreP7551m3bh2zZ89m69atXH/99We9blhYmMv/hYyMDAIDA+ujCufsbPceYNiwYS51WLBgQbXX9JR7f7a6n3nvPvjgAxwOB7fccku11/WE+16TzzVv/7kXKaV2ntp53t7Og8bd1lM7T+28yqid58Y/85a4haysLAuwlixZUuUxixYtsgDryJEjDRdYPXjhhResnj171vj43//+91aXLl1ctj300ENWQkJCHUfW8B5//HGrY8eOVnFxcaX7veWeA9acOXPKXhcXF1tRUVHWK6+8Urbt5MmTVnh4uPXOO+9UeZ3bbrvNGjZsmMu2oUOHWrfffnudx1yXzqx/Zb7//nsLsHbv3l3lMdOmTbPCw8PrNrh6VlndR48ebd1www21uo4n3vua3PcbbrjBGjx4cLXHeOJ9t6yKn2uN7ede5HRq51VN7TzPv+eW1bjbemrnzXHZpnZeObXz3OdnXj2+3ER2djYAzZs3P+uxvXr1Ijo6miFDhrBo0aL6Dq1ebNu2jdatWxMbG8vtt9/Ojh07qjx21apVJCUluWwbOnQoP/zwA4WFhfUdar0pKChgxowZ/OY3v8HhcFR7rDfc89Pt3LmTzMxMl/saEBDAoEGDWLlyZZXnVfV/obpzPEV2djYOh4OmTZtWe1xeXh7t2rWjTZs2XHvttaSkpDRMgHVs8eLFRERE0LlzZx544AGysrKqPd4b7/3+/fuZP38+991331mP9cT7fubnmn7upTFTO0/tvOp4wz0/k37nu1I7T+286njiffe0dp4SX27AsizGjh3L5ZdfTvfu3as8Ljo6mqlTpzJr1ixmz55NXFwcQ4YMYenSpQ0Y7fnr27cvH330EV999RXvvfcemZmZ9OvXj0OHDlV6fGZmJpGRkS7bIiMjOXXqFAcPHmyIkOvF3LlzOXr0KPfcc0+Vx3jLPT9TZmYmQKX3tXRfVefV9hxPcPLkScaNG8edd95JWFhYlcd16dKF6dOnM2/ePD755BMCAwPp378/27Zta8Boz9/w4cP5+OOP+fbbb3n99ddZs2YNgwcPJj8/v8pzvPHef/jhh4SGhnLzzTdXe5wn3vfKPtf0cy+Nldp5audVxVvueWX0O7+c2nlq51XHE++7J7bzfOv0anJOHn30UX788UeWL19e7XFxcXHExcWVvU5MTGTPnj289tprDBw4sL7DrDPDhw8ve96jRw8SExPp2LEjH374IWPHjq30nDO/KbMsq9LtnuT9999n+PDhtG7duspjvOWeV6Wy+3q2e3ou57izwsJCbr/9doqLi5k8eXK1xyYkJLhMDtq/f3969+7NW2+9xZtvvlnfodaZkSNHlj3v3r07ffr0oV27dsyfP7/axoG33fsPPviAu+6666xzOHjifa/uc00/99LYqJ2ndl5VvOWeV6ex/85XO0/tPLXz3ONnXj2+bPbYY48xb948Fi1aRJs2bWp9fkJCgltng2siJCSEHj16VFmPqKioChnfrKwsfH19adGiRUOEWOd2797NwoULuf/++2t9rjfc89LVnSq7r2dm/M88r7bnuLPCwkJuu+02du7cSXJycrXfAlbG6XRy6aWXevz/h+joaNq1a1dtPbzt3i9btoy0tLRz+h3g7ve9qs81/dxLY6R2ntp5teUN9xz0Ox/Uziuldl7tuPt999R2nhJfNrEsi0cffZTZs2fz7bffEhsbe07XSUlJITo6uo6ja1j5+fls3ry5ynokJiaWrYpT6uuvv6ZPnz74+fk1RIh1btq0aURERHDNNdfU+lxvuOexsbFERUW53NeCggKWLFlCv379qjyvqv8L1Z3jrkobQ9u2bWPhwoXn1Li3LIvU1FSP//9w6NAh9uzZU209vOneg+kJEB8fT8+ePWt9rrve97N9runnXhoTtfPKqZ1XO95wz0G/89XOK6d2Xu246333+HZenU6VLzX28MMPW+Hh4dbixYutjIyMsnL8+PGyY8aNG2eNGjWq7PVf//pXa86cOdbWrVutn376yRo3bpwFWLNmzbKjCufsqaeeshYvXmzt2LHDWr16tXXttddaoaGh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",
      "text/plain": [
       "<Figure size 1500x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "epoch_range = np.arange(epochs) + 1  # Starting from 1\n",
    "\n",
    "# The training set metrics.\n",
    "training_metrics = {\n",
    "    \"accuracy\": np.asarray(store_training_accurate_pred) / len(training_images),\n",
    "    \"error\": np.asarray(store_training_loss) / len(training_images),\n",
    "}\n",
    "\n",
    "# The test set metrics.\n",
    "test_metrics = {\n",
    "    \"accuracy\": np.asarray(store_test_accurate_pred) / len(test_images),\n",
    "    \"error\": np.asarray(store_test_loss) / len(test_images),\n",
    "}\n",
    "\n",
    "# Display the plots.\n",
    "fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(15, 5))\n",
    "for ax, metrics, title in zip(\n",
    "    axes, (training_metrics, test_metrics), (\"Training set\", \"Test set\")\n",
    "):\n",
    "    # Plot the metrics\n",
    "    for metric, values in metrics.items():\n",
    "        ax.plot(epoch_range, values, label=metric.capitalize())\n",
    "    ax.set_title(title)\n",
    "    ax.set_xlabel(\"Epochs\")\n",
    "    ax.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fec74ba2",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
